package hust.music.dao;

import java.util.List;

import javax.persistence.EntityManager;

/**
 * JpaDao
 * 
 * @author Txazo
 * @since 1.0
 */
public interface JpaDao {

	public EntityManager getEntityManager();

	/**
	 * 持久化实体
	 * 
	 * @param <T> 泛型
	 * @param t 实体
	 */
	public <T> void save(T t);

	/**
	 * 删除实体
	 * 
	 * @param <T> 泛型
	 * @param t 实体
	 */
	public <T> void delete(T t);

	/**
	 * 根据主键删除实体
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param id 实体主键
	 */
	public <T> void delete(Class<T> entityClass, Integer id);

	/**
	 * 更新实体
	 * 
	 * @param <T> 泛型
	 * @param t 实体
	 */
	public <T> void update(T t);

	/**
	 * 查询实体
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param id 实体主键
	 * @return 实体
	 */
	public <T> T get(Class<T> entityClass, Integer id);

	/**
	 * 查询实体集
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @return 实体集
	 */
	public <T> List<T> findAll(Class<T> entityClass, String jpql);

	/**
	 * 查询实体集
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @param param 参数
	 * @return 实体集
	 */
	public <T> List<T> findAll(Class<T> entityClass, String jpql, Object param);

	/**
	 * 查询实体集
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @param params 参数集
	 * @return 实体集
	 */
	public <T> List<T> findAll(Class<T> entityClass, String jpql,
			Object[] params);

	/**
	 * 分页查询
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @param firstResult 开始记录
	 * @param maxResult 查询记录数
	 * @return 实体集
	 */
	public <T> List<T> findByPage(final Class<T> entityClass,
			final String jpql, final int firstResult, final int maxResult);

	/**
	 * 分页查询
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @param param 参数
	 * @param firstResult 开始记录
	 * @param maxResult 查询记录数
	 * @return 实体集
	 */
	public <T> List<T> findByPage(final Class<T> entityClass,
			final String jpql, final Object param, final int firstResult,
			final int maxResult);

	/**
	 * 分页查询
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @param params 参数集
	 * @param firstResult 开始记录
	 * @param maxResult 查询记录数
	 * @return 实体集
	 */
	public <T> List<T> findByPage(final Class<T> entityClass,
			final String jpql, final Object[] params, final int firstResult,
			final int maxResult);

}